perm filename FINDX1[1,ALS] blob sn#508607 filedate 1980-05-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	FINDX1 FINDX2 FINDX3 INS1 INS1AA INS1AB INS1B INS1C FOUNDK FOUNDP INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z
C00008 ENDMK
C⊗;
;FINDX1 FINDX2 FINDX3 INS1 INS1AA INS1AB INS1B INS1C FOUNDK FOUNDP INS1F INS1G INS3 INS3K INS3X INS3Y INS3Z
;Modified for 4 or 5 words per entry instead of 2 or 3
;INP file contains INPA, INPP, INPM, IMPV and INPK for boards with kings.
;and ANPA, INPP, INPM and INPV for boards without kings.
;INPM has 6 fields, 2@8 for trunk# or name, 1@8 for serial# and 2@6 for move.
;INPV has 6 fields @6 for 6 variation numbers.
;BLOWUP==↑D10		;RELATIVE SIZE OF INPSIZ IN L AND P
;INPSIZ==↑D1024*BLOWUP	;INPSIZ=↑D1020 IN CKP
;BOKSIZ=↑D512		;2**N FOR CONVENIENCE
;INPMAX==↑D768*BLOWUP	;MAX SIZE ALLOWED ON DMPFIL
;INPCNT:	Z		;Current count of words occupied

FINDX1:	
	MOVEI	U1,[ASCIZ /
CNT=/]
	PUSHJ	PDP,PRINT
	MOVE	U1,INPCNT
	PUSHJ	PDP,NUMOUT
	MOVE	Z,INPCNT
	ADDI	Z,4		;Words per entry for non-king boards
	JUMPE	U4,FINDX2
	ADDI	Z,1		;One more word if king board
	MOVEM	Z,INPCNT
	TRNE	Z,1
	ADDI	Z,5		;To guarentee even number of entries
	JRST	FINDX3
FINDX2:	MOVEM	Z,INPCNT
	TRNE	Z,4
	ADDI	Z,4		;To guarentee even number of entries
FINDX3:	LSH	Z,-1		;Divide by 2


INS1:	SETZ	X1,
	CAMLE	U2,INPA(X1)	;Current A is in U2
	POPJ	PDP,		;Ahead of all present entries
	CAME	U2,INPA(X1)
	JRST	INS1AA		;BEYOND START
	CAMLE	U3,INPP(X1)	;Current P is in U3
	POPJ	PDP,		;Still want it first
	CAME	U3,INPP(X1)
	JRST	INS1AA		;BEYOND START
	JUMPE	U4,FOUNDP	;Duplicate is found (NON-KING CASE)
	CAMLE	U4,INPK(X1)	;Current K is in U4 (and ≠0)
	POPJ	PDP,		;Yep, first it is
	CAMN	U4,INPK(X1)
	JRST	FOUNDK		;K DUPLICATE IS FOUND
INS1AA:	MOVE	X1,INPCNT	;NON KING CASE, go to last entry next
	SUBI	X1,4
	SKIPE	U4		;are there kings?
	SUBI	X1,1		;KING CASE
	CAMGE	U2,INPA(X1)
	JRST	INS1G		;BEYOND END 
	CAME	U2,INPA(X1)
	JRST	INS1AB		;IN RANGE
	CAMGE	U3,INPP(X1)
	JRST	INS1G		;BEYOND RANGE
	CAME	U3,INPP(X1)
	JRST	INS1AB		;IN RANGE
	JUMPE	U4,FOUNDP	;MOVE IS FOUND
	CAMGE	U4,INPK(X1)
	JRST	INS1G		;BEYOND RANGE
	CAMN	U4,INPK(X1)
	JRST	FOUNDK		;FOUND
INS1AB:	MOVE	X1,INPCNT
	SUB	X1,Z		;X1 is too large
INS1B:	JUMPE	U4,.+4
	TRNE	Z,1
	ADDI	Z,5	;MAKE MULTIPLE OF 10
	JRST	.+3
	TRNE	Z,4
	ADDI	Z,4		;Make multiple of 8
	LSH	Z,-1
	CAMN	U2,INPA(X1)	;FIND: X1|INPA(X1)>U2>INPA+1(X1)
	JRST	INS3		;SIMPLE CASE
	CAMG	U2,INPA(X1)	;X1 TOO LARGE OR TOO SMALL?
	JRST	INS1F		;TOO SMALL
	JRST	INS3X		;TOO LARGE

INS1C:	SUB	X1,Z		;X1 TOO LARGE SO MAKE SMALLER
	JUMPN	U4,.+4
	CAIGE	X1,4
	MOVEI	X1,4
	JRST	INS1B
	CAIGE	X1,5
	MOVEI	X1,5
	JRST	INS1B

FOUNDK:
	MOVEI	Z,12		;To single step for king case (Z/2 in INS1B)
	SKIPA			;New move to go after recorded one
FOUNDP:	MOVEI	Z,10		;To single step for non-king case
;	MOVEI	U1,[ASCIZ / AT FOUND /]
;	PUSHJ	PDP,PRINT

INS1F:
;	MOVEI	U1,[ASCIZ / AT INS1F /]
;	PUSHJ	PDP,PRINT
	ADD	X1,Z		;TOO SMALL, SO MAKE IT BIGGER
	JUMPN	U4,.+4
	CAILE	X1,INPCNT-4
	MOVEI	X1,INPCNT-4
	JRST	INS1B
	CAILE	X1,INPCNT-5
	MOVEI	X1,INPCNT-5
	JRST	INS1B

INS1G:
;	MOVEI	U1,[ASCIZ / AT INSIG /]
;	PUSHJ	PDP,PRINT
	MOVE	X1,INPCNT	;To go at the end
	POPJ	PDP,

INS3:
	CAMN	U3,INPP(X1)
	JRST	INS3K
	CAMG	U3,INPP(X1)
	JRST	INS1F		;TOO SMALL
	JRST	INS3X

INS3K:	JUMPE	U4,FOUNDP
	CAMN	U4,INPK(X1)
	JRST	FOUNDK		;BOARD IS FOUND
	CAMG	U4,INPK(X1)
	JRST	INS1F		;TOO SMALL
INS3X:
	MOVE	X5,INPA-4(X1)	;FOR NON-KING CASE
	SKIPE	U4
	MOVE	X5,INPA-5(X1)	;KING CASE
	CAMN	U2,X5
	JRST	INS3Y
	CAMG	U2,X5
	POPJ	PDP,		;It goes in here
	JRST	INS1C

INS3Y:
	MOVE	X5,INPP-4(X1)	;NON-KING CASE AGAIN
	SKIPE	U4
	MOVE	X5,INPP-5(X1)	;KING CASE
	CAME	U3,X5
	JRST	.+4
	JUMPN	U4,INS3Z
	SUBI	X1,4
	JRST	FOUNDP
	CAMG	U3,X5
	POPJ	PDP,		;IT GOES IN HERE
	JRST	INS1C		;TOO LARGE

INS3Z:
	CAME	U4,INPK-5(X1)
	JRST	.+3
	SUBI	X1,5
	JRST	FOUNDK
	CAMG	U4,INPK-5(X1)
	POPJ	PDP,		;It goes in here
	JRST	INS1C		;TOO LARGE